package com.mt.roll.opcua.s7.my.s7connector.type;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Desc: ""
 * @Author: caixiang
 * @DATE: 2022/1/7 14:41
 */
public enum DataTransportSize {

    NULL((short) 0x00, (boolean) false),
    BIT((short) 0x03, (boolean) true),
    BYTE_WORD_DWORD((short) 0x04, (boolean) true),
    INTEGER((short) 0x05, (boolean) true),
    DINTEGER((short) 0x06, (boolean) false),
    REAL((short) 0x07, (boolean) false),
    OCTET_STRING((short) 0x09, (boolean) false);

    private static final Logger logger = LoggerFactory.getLogger(DataTransportSize.class);

    private static final Map<Short, DataTransportSize> map;
    static {
        map = new HashMap<>();
        for (DataTransportSize value : DataTransportSize.values()) {
            map.put((short) value.getValue(), value);
        }
    }

    private short value;
    private boolean sizeInBits;

    DataTransportSize(short value, boolean sizeInBits) {
        this.value = value;
        this.sizeInBits = sizeInBits;
    }

    public short getValue() {
        return value;
    }

    public boolean getSizeInBits() {
        return sizeInBits;
    }

    public static DataTransportSize firstEnumForFieldSizeInBits(boolean fieldValue) {
        for (DataTransportSize _val : DataTransportSize.values()) {
            if(_val.getSizeInBits() == fieldValue) {
                return _val;
            }
        }
        return null;
    }

    public static List<DataTransportSize> enumsForFieldSizeInBits(boolean fieldValue) {
        List<DataTransportSize> _values = new ArrayList();
        for (DataTransportSize _val : DataTransportSize.values()) {
            if(_val.getSizeInBits() == fieldValue) {
                _values.add(_val);
            }
        }
        return _values;
    }

    public static DataTransportSize enumForValue(short value) {
        if (!map.containsKey(value)) {
            logger.error("No DataTransportSize for value {}", value);
        }
        return map.get(value);
    }

    public static Boolean isDefined(short value) {
        return map.containsKey(value);
    }

}
